/*
类中的任何private方法都是隐式的final。这是因为不能访问一个private方法，也不能重写它。
可以将final修饰符添加到private方法中，但它不会赋予该方法任何额外的意义。

“重写”只有在方法是基类接口的一部分时才会发生。
如果一个方法是private的，它就不是基类接口的一部分。它只是隐藏在类中的代码，只不过恰好具有相同的名称而已。
即使在子类中创建了具有相同名称的public、protected或包访问权限的方法，它与基类中这个相同名称的方法也没有任何联系。
实际并没有重写该方法，只不过是创建了一个新的方法。
 */

class WithFinals {
    private final void f() {
        System.out.println("WithFinals.f()");
    }

    private void g() {
        System.out.println("WithFinals.g()");
    }
}

class OverridingPrivate extends WithFinals {
    private final void f() {
        System.out.println("OverridingPrivate.f()");
    }

    private void g() {
        System.out.println("OverridingPrivate.g()");
    }
}

class OverridingPrivate2 extends OverridingPrivate {
    public final void f() {
        System.out.println("OverridingPrivate2.f()");
    }

    public void g() {
        System.out.println("OverridingPrivate2.g()");
    }
}


public class FinalOverridingIllusion {
    public static void main(String[] args) {
        OverridingPrivate2 op2 = new OverridingPrivate2();
        op2.f();
        op2.g();

        // 向上转型
        OverridingPrivate op = op2;
//        op.f();  // 不能调用这些方法
//        op.g();

        WithFinals wf = op2;
//        wf.f();
//        wf.g();
    }
}